package com.itstyle.seckill.common.dynamicquery;

import java.util.List;

/**
 * 扩展 SpringDataJpa, 支持动态 jpql/nativesql 查询并支持分页查询
 * 使用方法：注入 ServiceImpl
 */
public interface DynamicQuery {

    void save(Object entity);

    void update(Object entity);

    <T> void delete(Class<T> entityClass, Object entityid);

    <T> void delete(Class<T> entityClass, Object[] entityids);


    /**
     * 查询对象列表，返回 List
     *
     * @param nativeSql
     * @param params
     * @return List<T>
     */
    <T> List<T> nativeQueryList(String nativeSql, Object... params);

    /**
     * 查询对象列表，返回 List<Map<key,value>>
     *
     * @param nativeSql
     * @param params
     * @return List<T>
     */
    <T> List<T> nativeQueryListMap(String nativeSql, Object... params);

    /**
     * 查询对象列表，返回 List<组合对象>
     *
     * @param resultClass
     * @param nativeSql
     * @param params
     * @return List<T>
     */
    <T> List<T> nativeQueryListModel(Class<T> resultClass, String nativeSql, Object... params);

    /**
     * 执行 nativeSql 统计查询
     *
     * @param nativeSql
     * @param params    占位符参数例（如 ?1 ）绑定的参数值
     * @return 统计条数
     */
    Object nativeQueryObject(String nativeSql, Object... params);

    /**
     * 执行 nativeSql 统计查询
     *
     * @param nativeSql
     * @param params    占位符参数（例如 ?1 ）绑定的参数值
     * @return 统计条数
     */
    Object[] nativeQueryArray(String nativeSql, Object... params);

    /**
     * 执行 nativeSql 的 update，delete 操作
     *
     * @param nativeSql
     * @param params
     * @return
     */
    int nativeExecuteUpdate(String nativeSql, Object... params);
}
